// 闭包需要了解作用域

/**
 * js的作用域有全局作用域和函数作用域,es6以后出现了块级作用域
 * */

/**
 * 全局作用域
 * 1、全局声明
 * 2、函数内部没有声明的变量直接赋值，也是全局作用域
 * */ 

var globalName = 'global'

function getName() {
  // console.log(globalName, '+++++') // global+++++
  var name = 'inner'
  // console.log(name, '++++++++++') // inner++++++++++
}
getName()

// console.log(globalName, '-------') // global -------
// console.log(name, '----')  // name is not defined

/**
 * 函数作用域
 * */ 
function getName() {

  var name = 'inner';

  // console.log(name); //inner

}

getName();

// console.log(name); // name is not defined

// console.log(a) // a is not defined
if(true){
  let a = 'a'
  // console.log(a) // a
}
// console.log(a) // a is not defined


/**
 * 闭包的概念：闭包其实就是一个可以访问其他函数内部变量的函数
 * 红宝书：红宝书闭包的定义：闭包是指有权访问另外一个函数作用域中的变量的函数
 * MDN:个函数和对其周围状态的引用捆绑在一起（或者说函数被引用包围），这样的组合就是闭包（closure）。
 * */ 

function fun1(){
  var a = 1
  return function(){
    var a = 2
    console.log(a,'我在内部访问')
    return a
  }
}
fun1()
let result = fun1()
console.log(result(),'我在外部访问')

/**
 * 闭包的表现形式
 * 1. 返回一个函数，上面讲原因的时候已经说过，这里就不赘述了。
 * 2. 在定时器、事件监听、Ajax 请求、Web Workers 或者任何异步中，只要使用了回调函数，实际上就是在使用闭包。请看下面这段代码，这些都是平常开发中用到的形式。
 * */ 
